import java.util.Scanner;

/**
 * @author yu
 * @date 2025年04月16日 17:36
 */
public class test2 {
    // 定义每个方向对应的四个边的凹凸情况（上、右、下、左）
    // 1表示凸，0表示凹（或者其他约定，题目没有明确说明，这里假设1是凸，0是凹）
    // 根据题目描述，我们需要知道每个旋转状态下拼图块的凹凸情况
    // 由于题目没有给出具体凹凸定义，我们需要根据示例推断
    // 这里假设初始'W'状态为：上凸(1)，右凸(1)，下凹(0)，左凹(0)
    // 旋转会改变边的位置
    private static final int[][] DIRECTIONS = {
            {1, 1, 0, 0}, // W (0度)
            {0, 1, 1, 0},  // D (90度) - 顺时针旋转90度，原上边变为左边
            {0, 0, 1, 1},  // S (180度)
            {1, 0, 0, 1}   // A (270度)
    };

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();

        while (t-- > 0) {
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            scanner.nextLine(); // 消耗换行符

            char[][] grid = new char[n][m];
            for (int i = 0; i < n; i++) {
                grid[i] = scanner.nextLine().toCharArray();
            }

            if (isValidPuzzle(grid, n, m)) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    }

    private static boolean isValidPuzzle(char[][] grid, int n, int m) {
        // 检查每个格子与相邻格子的匹配情况
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == '*') continue;

                int[] currentEdges = getEdges(grid[i][j]);

                // 检查上方邻居
                if (i > 0 && grid[i-1][j] != '*') {
                    int[] topEdges = getEdges(grid[i-1][j]);
                    if (currentEdges[0] == topEdges[2]) { // 当前的上边与邻居的下边相同
                        return false;
                    }
                }

                // 检查右方邻居
                if (j < m-1 && grid[i][j+1] != '*') {
                    int[] rightEdges = getEdges(grid[i][j+1]);
                    if (currentEdges[1] == rightEdges[3]) { // 当前的右边与邻居的左边相同
                        return false;
                    }
                }

                // 检查下方邻居
                if (i < n-1 && grid[i+1][j] != '*') {
                    int[] bottomEdges = getEdges(grid[i+1][j]);
                    if (currentEdges[2] == bottomEdges[0]) { // 当前的下边与邻居的上边相同
                        return false;
                    }
                }

                // 检查左方邻居
                if (j > 0 && grid[i][j-1] != '*') {
                    int[] leftEdges = getEdges(grid[i][j-1]);
                    if (currentEdges[3] == leftEdges[1]) { // 当前的左边与邻居的右边相同
                        return false;
                    }
                }
            }
        }
        return true;
    }

    private static int[] getEdges(char c) {
        switch (c) {
            case 'W': return DIRECTIONS[0];
            case 'D': return DIRECTIONS[1];
            case 'S': return DIRECTIONS[2];
            case 'A': return DIRECTIONS[3];
            default: return new int[]{0, 0, 0, 0}; // 对于'*'或其他无效字符
        }
    }
}